/*
    实现⼀个算法，⽀持任意2-16进制数之间转换，如：2进制转7进制，7进制转16进制，15进
制转8进制等。
    输⼊: 9(10), 8      #输⼊两个参数：10进制的9(字符串)，转换⽬标进制8(数字)
    输出：11            #返回结果，8进制的11(字符串)
    输⼊: 1111(2), 15   #输⼊2进制的1111，转换为15进制
    输出：10(15)        #返回结果，15进制的10(字符串)
    思路：首先根据输入解析待转换的字符串，以及该数字的进制，先将其保存为十进制，然后在按照输入要求转换成相应的进制数。输入输出要字符串格式，单独处理。
*/

pub fn convert_base(num_str: &str, to_base: u32) -> String {
    //将待转换数字和进制提取
    let parts: Vec<&str> = num_str.split("(").collect();
    let num = parts[0];
    let from_base = parts[1].trim_end_matches(")").parse::<u32>().unwrap();

    // 将源进制的字符串转换为十进制数
    let decimal_value = to_decimal(num, from_base);

    // 将十进制数转换为目标进制的字符串
    from_decimal(decimal_value, to_base)
}
// 将字符映射到对应的数值
fn char_to_value(c: char) -> u32 {
    match c {
        '0'..='9' => c.to_digit(10).unwrap(),
        'A'..='F' => c as u32 - 'A' as u32 + 10,
        _ => panic!("Invalid character"),
    }
}

// 将数值映射到对应的字符
fn value_to_char(v: u32) -> char {
    match v {
        0..=9 => std::char::from_digit(v, 10).unwrap(),
        10..=15 => (v - 10 + 'A' as u32) as u8 as char,
        _ => panic!("Invalid value"),
    }
}

// 将源进制的字符串转换为十进制数
fn to_decimal(input: &str, base: u32) -> u32 {
    input
        .chars()
        .rev()
        .enumerate()
        .fold(0, |acc, (i, c)| acc + char_to_value(c) * base.pow(i as u32))
}

// 将十进制数转换为目标进制的字符串
fn from_decimal(num: u32, base: u32) -> String {
    let mut num = num;
    let mut result = String::new();
    while num > 0 {
        result.push(value_to_char(num % base));
        num /= base;
    }
    if result.is_empty() {
        result.push('0');
    }
    result.chars().rev().collect()
}
